package d1_midterm_examination.d3_thirdquestion;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class OkTest {
    public static void main(String[] args) {
        //目标: 完成题目3
        //1.起始日子到目标月份的全部日子-->首先起始日子是:2022年2月3日-->将起始日子封装成LocalDate对象
        LocalDate startTime = LocalDate.of(2022, 2, 3);

        //2、获取查询的年份和月份,再拿到这个月的最后一天
        //2.1创建提个扫描器
        Scanner sc = new Scanner(System.in);
        //2.2提示用户输入日期
        System.out.println("请您输入要查询的年份和月份, 以便为您展示该月的休息日(注意: 必须是2022-02月开始之后: )");

        //2.3接受用户输入的日期
        String currentDate = sc.next() + "-01";
        //2.4将用户输入的日期转成LocalDate对象
        LocalDate firstDateOfMonth = LocalDate.parse(currentDate);
        //展示结果看一下
        System.out.println(firstDateOfMonth);

        LocalDate endDate = firstDateOfMonth.plusMonths(1).minusDays(1);
        System.out.println(endDate);

        //3、获取从起始日期到截止日期,然后封装到对象中去,在存到集合中,便于后面的查询操作
        //4、创建一个集合,用于存储Day对象
        List<Day> days = new ArrayList<>();

        //5、循环将每一天封装到对象中去
        //9、当startTime到了查询月的最后一天,就退出循环
        while (!startTime.isAfter(endDate)) {
            //7、首先创建一个对象,用于存储每个日期的时间
            Day day = new Day();
            //6、将起始时间先封装到对象中去
            day.setLocalDate(startTime);

            //8、然后从起始日期,开始往后一天一天的推
            startTime = startTime.plusDays(1);

            //10、然后将封装好的day对象存到集合中去
            days.add(day);
        }
        //11、展示集合信息
        System.out.println(days);
        System.out.println("--------------------------------");
        //12、开始为休息日左上标记-->true是休息, false: 不工作日
        //第一步: 遍历集合,获取所有的日期对象-->从开始日期,每加两天就是休息日
        for (int i = 0; i < days.size(); i += 3) {
            days.get(i).setFlag(true);
        }

        //13、然后再次进行展示结果
        System.out.println(days);
        System.out.println("--------------------------------");

        //16、创建一个集合->存储当月的day对象,变异后续操作
        List<Day> currentMonthDay = new ArrayList<>();
        //14、开始展示当月的休息日情况
        //15、再次遍历集合
        for (int i = 0; i < days.size(); i++) {
            //获取每一个day对象
            Day day = days.get(i);
            if (!day.getLocalDate().isBefore(firstDateOfMonth)) {
                System.out.print(day.getLocalDate() + (day.isFlag() ? " [休息] " : " "));

                //17、然后将当前月的Day对象存到集合中去
                currentMonthDay.add(day);
            }
        }
        System.out.println("--------------------------------------");
        //18、开始展示当月休息日哪个是周六与周日
        //19、使用Stream流做
        /*currentMonthDay.stream().filter(d -> {
            return (d.getLocalDate().getDayOfWeek().getValue() == 7 ||
                    d.getLocalDate().getDayOfWeek().getValue() == 6) && d.isFlag();
        }).forEach(day -> {
            System.out.print(
                    day.getLocalDate() + (day.isFlag() ? " [休息] " : " ") +
                            (day.getLocalDate().getDayOfWeek().getValue() == 7 ? "周末 " : "周六 "));
        });*/
        //简化版本:
        currentMonthDay.stream().filter(d ->
                (d.getLocalDate().getDayOfWeek().getValue() == 7 ||
                        d.getLocalDate().getDayOfWeek().getValue() == 6) && d.isFlag()
        ).forEach(day ->
                System.out.print(
                        day.getLocalDate() + (day.isFlag() ? " [休息] " : " ") +
                                (day.getLocalDate().getDayOfWeek().getValue() == 7 ? "周末 " : "周六 "))
        );
    }
}
